export class WebSocketClient {
  private ws: WebSocket | null = null;
  private intervalId: number | null = null;
  private retryCount: number = 0; // 重连次数

  /**
 * 建立WebSocket连接
 * 
 * @param config 连接配置对象
 * @param config.serverUrl 请求地址
 * @param config.onMessageCallback 收到消息时的回调函数
 * @param config.reconnectDelay 重连延迟时间（毫秒）
 * @param config.heartbeat 心跳间隔时间（毫秒）
 * @param config.params 发送的消息参数
 */

  connect ( config: { serverUrl: string, onMessageCallback: ( data: any ) => void, reconnectDelay: number, heartbeat: number, send: boolean, params: any } ): void {
    this.cleanup(); // 先清理旧资源，再创建新连接
    const { serverUrl, onMessageCallback, heartbeat, send, params } = config;
    this.ws = new WebSocket(serverUrl);

    // 连接成功回调
    this.ws.onopen = () => {
      console.log( "WebSocket连接已建立" );
      this.retryCount = 0; // 重连次数归零
      if ( send && heartbeat ) {
        // 重复向服务器发送一次数据请求，时间：heartbeat
        this.intervalId = window.setInterval(() => {
          if (this.ws?.readyState === WebSocket.OPEN) {
            this.ws.send(JSON.stringify({ params: params })); // 发送请求指令
          }
        }, heartbeat);
      }
    };

    // 接收服务器数据
    this.ws.onmessage = (event) => {
      const data = JSON.parse(event.data);
      console.log( "收到实时数据:", data );
      // 调用回调函数
      onMessageCallback(data);
    };

    // 连接错误
    this.ws.onerror = (error) => {
      console.error("WebSocket错误:", error);
      // 重连
      this.retry(config);
    };

    // 连接关闭
    this.ws.onclose = (event) => {
      console.log(`连接关闭，代码: ${event.code}, 原因: ${event.reason}`);
      this.cleanup(); // 关闭时释放资源
      // 非正常关闭（如异常断开）时触发重连
      if (event.code !== 1000) { // 1000是正常关闭码
        this.retry(config); 
      }
    };
  }

  // 主动释放连接
  disconnect(): void {
    if (this.ws) {
      this.ws.close(1000, "客户端主动关闭"); // 1000是正常关闭代码
    }
  }

  // 清理资源（定时器、连接对象）
  private cleanup(): void {
    if (this.intervalId) {
      clearInterval(this.intervalId); // 停止定时请求
      this.intervalId = null;
    }
    this.ws = null; // 清空旧连接
  }

  // 重连
  private retry ( config: { serverUrl: string, onMessageCallback: ( data: any ) => void, reconnectDelay: number, heartbeat: number, send: boolean, params: any } ): void {
    const { reconnectDelay } = config;
    if (this.retryCount < 3) {
      setTimeout( () => {
        this.retryCount += 1;
        console.log(`WebSocket第${this.retryCount}次重连`);
        try{
          this.connect( config );
        }catch (error){
          console.error("WebSocket重连失败:", error);
          this.retry(config);
        }
      }, reconnectDelay);
    } else {
      this.cleanup(); // 出错时释放资源
      console.error("WebSocket重连失败，超过最大重试次数");
    }
  }
}